#include <iostream>  
  
using namespace std;  
  
// 定义节点结构体  
struct Node {  
    int data;  
    Node* next;  
};  
  
// 定义链队类  
class LinkedQueue {  
private:  
    Node* front; // 队首指针  
    Node* rear; // 队尾指针  
public:  
    LinkedQueue() { // 初始化链队  
        front = rear = nullptr;  
    }  
    ~LinkedQueue() { // 析构函数，释放内存  
        while (!isEmpty()) {  
            dequeue();  
        }  
    }  
    bool isEmpty() { // 判断队列是否为空  
        return front == nullptr;  
    }  
    void enqueue(int value) { // 入队操作  
        Node* newNode = new Node();  
        newNode->data = value;  
        newNode->next = nullptr;  
        if (isEmpty()) { // 如果队列为空，将新节点设置为队首和队尾  
            front = rear = newNode;  
            return;  
        }  
        rear->next = newNode; // 将新节点添加到队尾，更新队尾指针  
        rear = newNode;  
    }  
    int dequeue() { // 出队操作  
        if (isEmpty()) { // 如果队列为空，返回-1表示出队失败，并清空队列  
            cout << "Queue is empty. Cannot dequeue." << endl;  
            front = rear = nullptr;  
            return -1;  
        }  
        int value = front->data; // 获取队首元素的值  
        Node* temp = front; // 保存队首节点指针，用于删除操作  
        front = front->next; // 移动队首指针，指向下一个元素（可能为空）  
        if (front == nullptr) { // 如果队列只有一个元素，重置队首和队尾指针为空  
            rear = nullptr;  
        } else { // 如果队列有多个元素，更新队尾指针的位置（保持原来的最后一个元素在队尾）  
            rear->next = front;  
            rear = front->next; // 更新队尾指针的位置（保持原来的最后一个元素在队尾）  
        }  
        delete temp; // 释放被删除节点的内存空间  
        return value; // 返回被删除元素的值（如果队列为空则返回-1）  
    }  
    int front() { // 查看队首元素的值（如果队列为空则返回-1）  
        if (isEmpty()) { // 如果队列为空，返回-1表示获取失败，并清空队列（可以修改为抛出异常）  
            cout << "Queue is empty. Cannot get front element." << endl;  
            front = rear = nullptr; // 清空队列（可以修改为抛出异常）  
            return -1; // 返回-1表示获取失败（可以修改为抛出异常）  
        }